<?php

/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2019/10/10
 * Time: 15:19
 */

namespace App\Http\Controllers\LibApi;

use App\Http\Controllers\Websocket\SocketClientCQSip2;
use Illuminate\Support\Facades\Log;

/**
 * 重庆（图书馆） sip2 接口  数据解析（socket） 所有接口通借通还 （重庆 9个主城区都可使用，重庆市一卡通成员馆）
 * Class ScoketDataAnalysis
 * @package app\websocket\controller
 */
class CqLibApiSip2Controller
{
    // public $service_ip = '222.178.122.21'; //socket ip       之前地址
    public $service_ip = '113.207.106.168'; //socket ip       上云后地址
    public $service_port = '30001'; //socket 端口

    public $client_id = ''; //设备号

    private static $adminName = 'bt_bxdd_yz';
    private static $password = 'bt_bxdd_yz@123';


    //测试读者证：yxyz01   密码：19910406    身份证号码：520102199104061213   名字：阅享驿站测试
    public $socketClientObj = null;

    public function __construct()
    {
        $this->socketClientObj = new SocketClientCQSip2($this->service_ip, $this->service_port);
    }

    /**
     * 读者信息查询接口 （账号 + 密码）
     * @param $account  账号   测试读者证：yxyz01   密码：19910406    身份证号码：520102199104061213   名字：阅享驿站测试  可以为芯片号
     * @param $password  密码
     * @param $id_card  身份证号码      与账号  二选一
     * @param $type  1 为读者证号  2 身份证号码     默认读者证
     */
    public function getRFeaderInfo($account = '', $password = '', $type = 1)
    {
        if (empty($account) && empty($id_card)) {
            return ['code' => 202, 'msg' => '账号和身份证号码不能同时为空'];
        }
        // if (empty($password)) {
        //     return ['code' => 202, 'msg' => '密码不能为空'];
        // }

        $time = date('Ymd    His');
        if ($type == 2) {
            $prefix = '67';
            $account = strtoupper($account);
        } else {
            $prefix = '63';
        }
        $instruct = $prefix . "019" . $time . "Y          AO" . $this->client_id . "|AA" . $account . "|AD" . $password . "|AY";  //如果使用芯片卡，“BA”传证号，“AA”传芯片号。
        $sip2_data = $this->socketClientObj->socketClientGetData($instruct . "\r\n");
        $data = isset($sip2_data['content']) ? $sip2_data['content'] : null;

        //写入日志
        Log::channel('libapi')->info('重庆图书馆，重庆 9个主城区都可使用，重庆市一卡通成员馆');
        Log::channel('libapi')->info('URL：' . $instruct);
        //写入日志
        Log::channel('libapi')->info($data);

        if ($sip2_data['code'] != 200) {
            return ['code' => 203, 'msg' => $sip2_data['msg']];
        }
        if ($data) {
            //获取AC 后面的数字
            $data_arr = explode("|", $data);
            $data_arr = $this->assembleData($data_arr);
            if (empty($data_arr['BL']) || $data_arr['BL'] != 'Y') {
                return ['code' => 203, 'msg' => '账号不存在'];
            }

            //CQ	验证密码：Y表示读者密码正确，N表示读者密码错误
            if (!empty($password)) {
                //未输入密码，不验证密码，输入密码，需要验证密码
                if ($data_arr['CQ'] != 'Y') {
                    return ['code' => 203, 'msg' => '账号或密码输入错误'];
                }
            }
            //判断读者证号是否存在，存在则表示登录成功
            if (!empty($data_arr['AA'])) {
                //获取读者信息
                //  $result['reader_id'] = $prefix == '63' ? trim($data_arr['AA']) : trim($data_arr['BA']);

                $result['reader_id'] = !empty($data_arr['AA']) ? trim($data_arr['AA']) : trim($data_arr['BA']);

                //  $result['id_card'] = $prefix == '63' ? '' : trim($data_arr['XO']); //读者证号查询，不返回身份证号码
                $result['id_card'] = !empty($data_arr['XO']) ? trim($data_arr['XO']) : ''; //读者证号查询，不返回身份证号码,有时又返回，有时又不返回
                $result['id_card'] = $result['id_card'] == 'null' ? '' : $result['id_card'];

                $result['password'] = !empty($data_arr['AD']) ? trim($data_arr['AD']) : $password;
                $result['username'] = trim($data_arr['AE']);
                //  $result['pavilion'] = !empty($data_arr['AM']) ? trim($data_arr['AM']) : '';
                $result['phone'] = !empty($data_arr['BP']) ? trim($data_arr['BP']) : '';
                $result['tel'] = !empty($data_arr['BF']) && $data_arr['BF'] != '未填写家庭电话' ? trim($data_arr['BF']) : '';
                $result['email'] = !empty($data_arr['BE']) && $data_arr['BE'] != "未填写e-mail" ? $data_arr['BE'] : '';
                $result['address'] = trim($data_arr['BD']);
                $result['cash'] = trim($data_arr['BV']);
                $result['reader_type'] = !empty($data_arr['XT']) ? trim($data_arr['XT']) : ''; //读者类型
                $result['advance'] = !empty($data_arr['JE']) ? trim($data_arr['JE']) : ''; //预付款
                $result['status'] = !empty($data_arr['AF']) && $data_arr['AF'] == '状态:有效' ? '有效' : '其他';
                $result['register_time'] = !empty($data_arr['XB']) ? trim($data_arr['XB']) : '';
                $result['max_borrow_num'] = trim($data_arr['BZ']); //允许最大借书数
                $result['bx'] = trim($data_arr['BX']); //允许最大借书数
                $result['bw'] = trim($data_arr['BW']); //允许最大借书数
                //   $result['birth'] = trim($data_arr['XH']);
                //   $result['nation'] = !empty($data_arr['XN']) ? trim($data_arr['XN']) : ''; //民族
                //   $result['native_place'] = !empty($data_arr['XP']) ? trim($data_arr['XP']) : '';  //籍贯
                //   $result['intro'] = !empty($data_arr['XF']) ? trim($data_arr['XF']) : ''; //备注
                $result['validity_time'] = trim($data_arr['XD']); //读者证有效日期
                //   $result['start_time'] = trim($data_arr['XE']); //读者证启用日期
                $result['sex'] = !empty($data_arr['XM']) ? trim($data_arr['XM']) : ''; //读者性别
                $result['arrea'] = !empty($data_arr['JF']) ? trim($data_arr['JF']) : ''; //欠费金额
                $result['pavilion'] = !empty($data_arr['ZM']) ? trim($data_arr['ZM']) : ''; //开户馆
                $result['now_borrow_book'] = !empty($data_arr['AU']) ? trim($data_arr['AU']) : ''; //当前借阅书籍
                $result['now_overdue_book'] = !empty($data_arr['AT']) ? trim($data_arr['AT']) : ''; //当前超期书籍

                return ['code' => 200, 'msg' => '获取成功', 'content' => $result];
            }
            return ['code' => 202, 'msg' => '获取读者信息失败'];
        }
        return ['code' => 203, 'msg' => '网络错误'];
    }




    /**
     * RFID登录  只能创建一个  socket 套接字
     * $instruct = "9300CNtest01|CO123456|CP044120|AY"
     */
    public function RFIDLogin()
    {
        $account = self::$adminName;
        $password = self::$password;
        $instruct = "9300CN" . $account . "|CO" . $password . "|CP" . $this->client_id . "|AY1AZF77E\r"; //登录必须要增加 . "\r\n"
        return $instruct;
    }




    /**
     * 重新解析数据，前2位转换为键名，后面的转换为键值
     * @param $data  数组
     */
    public function assembleData($data)
    {
        $res = [];
        foreach ($data as $key => $val) {
            if (strlen($val) >= 2) {
                $v = substr($val, 2);
                $res[substr($val, 0, 2)] = empty($v) ? '' : $v;
            }
        }
        return $res;
    }
}
